/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence.controllers.impl;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.osiris.persistence.Requisito;
import java.util.ArrayList;
import java.util.List;
import org.osiris.persistence.Detallerequisito;
import org.osiris.persistence.Proyecto;
import org.osiris.persistence.Requisitosdeproyecto;
import org.osiris.persistence.Impactocambio;
import org.osiris.persistence.Recursosderequisito;
import org.osiris.persistence.Asignacionesproyecto;
import org.osiris.persistence.Usuario;
import org.osiris.persistence.controllers.UsuarioInterface;
import org.osiris.persistence.controllers.exceptions.IllegalOrphanException;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;

/**
 *
 * @author amartinez
 */
public class UsuarioJpaController implements UsuarioInterface {

    public UsuarioJpaController() {
    	emf = CreadorPU.getEntityManagerFactory();
    }
    private EntityManagerFactory emf = null;

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#getEntityManager()
	 */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#create(org.osiris.persistence.Usuario)
	 */
    public void create(Usuario usuario) {
        if (usuario.getRequisitoList() == null) {
            usuario.setRequisitoList(new ArrayList<Requisito>());
        }
        if (usuario.getRequisitoCollection1() == null) {
            usuario.setRequisitoCollection1(new ArrayList<Requisito>());
        }
        if (usuario.getDetallerequisitoList() == null) {
            usuario.setDetallerequisitoList(new ArrayList<Detallerequisito>());
        }
        if (usuario.getProyectoList() == null) {
            usuario.setProyectoList(new ArrayList<Proyecto>());
        }
        if (usuario.getRequisitosdeproyectoList() == null) {
            usuario.setRequisitosdeproyectoList(new ArrayList<Requisitosdeproyecto>());
        }
        if (usuario.getImpactocambioList() == null) {
            usuario.setImpactocambioList(new ArrayList<Impactocambio>());
        }
        if (usuario.getRecursosderequisitoList() == null) {
            usuario.setRecursosderequisitoList(new ArrayList<Recursosderequisito>());
        }
        if (usuario.getAsignacionesproyectoList() == null) {
            usuario.setAsignacionesproyectoList(new ArrayList<Asignacionesproyecto>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Requisito> attachedRequisitoList = new ArrayList<Requisito>();
            for (Requisito requisitoListRequisitoToAttach : usuario.getRequisitoList()) {
                requisitoListRequisitoToAttach = em.getReference(requisitoListRequisitoToAttach.getClass(), requisitoListRequisitoToAttach.getIdRequisito());
                attachedRequisitoList.add(requisitoListRequisitoToAttach);
            }
            usuario.setRequisitoList(attachedRequisitoList);
            List<Requisito> attachedRequisitoCollection1 = new ArrayList<Requisito>();
            for (Requisito requisitoCollection1RequisitoToAttach : usuario.getRequisitoCollection1()) {
                requisitoCollection1RequisitoToAttach = em.getReference(requisitoCollection1RequisitoToAttach.getClass(), requisitoCollection1RequisitoToAttach.getIdRequisito());
                attachedRequisitoCollection1.add(requisitoCollection1RequisitoToAttach);
            }
            usuario.setRequisitoCollection1(attachedRequisitoCollection1);
            List<Detallerequisito> attachedDetallerequisitoList = new ArrayList<Detallerequisito>();
            for (Detallerequisito detallerequisitoListDetallerequisitoToAttach : usuario.getDetallerequisitoList()) {
                detallerequisitoListDetallerequisitoToAttach = em.getReference(detallerequisitoListDetallerequisitoToAttach.getClass(), detallerequisitoListDetallerequisitoToAttach.getIdRequisito());
                attachedDetallerequisitoList.add(detallerequisitoListDetallerequisitoToAttach);
            }
            usuario.setDetallerequisitoList(attachedDetallerequisitoList);
            List<Proyecto> attachedProyectoList = new ArrayList<Proyecto>();
            for (Proyecto proyectoListProyectoToAttach : usuario.getProyectoList()) {
                proyectoListProyectoToAttach = em.getReference(proyectoListProyectoToAttach.getClass(), proyectoListProyectoToAttach.getIdProyecto());
                attachedProyectoList.add(proyectoListProyectoToAttach);
            }
            usuario.setProyectoList(attachedProyectoList);
            List<Requisitosdeproyecto> attachedRequisitosdeproyectoList = new ArrayList<Requisitosdeproyecto>();
            for (Requisitosdeproyecto requisitosdeproyectoListRequisitosdeproyectoToAttach : usuario.getRequisitosdeproyectoList()) {
                requisitosdeproyectoListRequisitosdeproyectoToAttach = em.getReference(requisitosdeproyectoListRequisitosdeproyectoToAttach.getClass(), requisitosdeproyectoListRequisitosdeproyectoToAttach.getRequisitosdeproyectoPK());
                attachedRequisitosdeproyectoList.add(requisitosdeproyectoListRequisitosdeproyectoToAttach);
            }
            usuario.setRequisitosdeproyectoList(attachedRequisitosdeproyectoList);
            List<Impactocambio> attachedImpactocambioList = new ArrayList<Impactocambio>();
            for (Impactocambio impactocambioListImpactocambioToAttach : usuario.getImpactocambioList()) {
                impactocambioListImpactocambioToAttach = em.getReference(impactocambioListImpactocambioToAttach.getClass(), impactocambioListImpactocambioToAttach.getIdPeticion());
                attachedImpactocambioList.add(impactocambioListImpactocambioToAttach);
            }
            usuario.setImpactocambioList(attachedImpactocambioList);
            List<Recursosderequisito> attachedRecursosderequisitoList = new ArrayList<Recursosderequisito>();
            for (Recursosderequisito recursosderequisitoListRecursosderequisitoToAttach : usuario.getRecursosderequisitoList()) {
                recursosderequisitoListRecursosderequisitoToAttach = em.getReference(recursosderequisitoListRecursosderequisitoToAttach.getClass(), recursosderequisitoListRecursosderequisitoToAttach.getRecursosderequisitoPK());
                attachedRecursosderequisitoList.add(recursosderequisitoListRecursosderequisitoToAttach);
            }
            usuario.setRecursosderequisitoList(attachedRecursosderequisitoList);
            List<Asignacionesproyecto> attachedAsignacionesproyectoList = new ArrayList<Asignacionesproyecto>();
            for (Asignacionesproyecto asignacionesproyectoListAsignacionesproyectoToAttach : usuario.getAsignacionesproyectoList()) {
                asignacionesproyectoListAsignacionesproyectoToAttach = em.getReference(asignacionesproyectoListAsignacionesproyectoToAttach.getClass(), asignacionesproyectoListAsignacionesproyectoToAttach.getAsignacionesproyectoPK());
                attachedAsignacionesproyectoList.add(asignacionesproyectoListAsignacionesproyectoToAttach);
            }
            usuario.setAsignacionesproyectoList(attachedAsignacionesproyectoList);
            em.persist(usuario);
            for (Requisito requisitoListRequisito : usuario.getRequisitoList()) {
                Usuario oldResponsableOfRequisitoListRequisito = requisitoListRequisito.getResponsable();
                requisitoListRequisito.setResponsable(usuario);
                requisitoListRequisito = em.merge(requisitoListRequisito);
                if (oldResponsableOfRequisitoListRequisito != null) {
                    oldResponsableOfRequisitoListRequisito.getRequisitoList().remove(requisitoListRequisito);
                    oldResponsableOfRequisitoListRequisito = em.merge(oldResponsableOfRequisitoListRequisito);
                }
            }
            for (Requisito requisitoCollection1Requisito : usuario.getRequisitoCollection1()) {
                Usuario oldAutorOfRequisitoCollection1Requisito = requisitoCollection1Requisito.getAutor();
                requisitoCollection1Requisito.setAutor(usuario);
                requisitoCollection1Requisito = em.merge(requisitoCollection1Requisito);
                if (oldAutorOfRequisitoCollection1Requisito != null) {
                    oldAutorOfRequisitoCollection1Requisito.getRequisitoCollection1().remove(requisitoCollection1Requisito);
                    oldAutorOfRequisitoCollection1Requisito = em.merge(oldAutorOfRequisitoCollection1Requisito);
                }
            }
            for (Detallerequisito detallerequisitoListDetallerequisito : usuario.getDetallerequisitoList()) {
                Usuario oldUsuarioaltaOfDetallerequisitoListDetallerequisito = detallerequisitoListDetallerequisito.getUsuarioalta();
                detallerequisitoListDetallerequisito.setUsuarioalta(usuario);
                detallerequisitoListDetallerequisito = em.merge(detallerequisitoListDetallerequisito);
                if (oldUsuarioaltaOfDetallerequisitoListDetallerequisito != null) {
                    oldUsuarioaltaOfDetallerequisitoListDetallerequisito.getDetallerequisitoList().remove(detallerequisitoListDetallerequisito);
                    oldUsuarioaltaOfDetallerequisitoListDetallerequisito = em.merge(oldUsuarioaltaOfDetallerequisitoListDetallerequisito);
                }
            }
            for (Proyecto proyectoListProyecto : usuario.getProyectoList()) {
                Usuario oldUsuarioidUsuarioOfProyectoListProyecto = proyectoListProyecto.getUsuarioidUsuario();
                proyectoListProyecto.setUsuarioidUsuario(usuario);
                proyectoListProyecto = em.merge(proyectoListProyecto);
                if (oldUsuarioidUsuarioOfProyectoListProyecto != null) {
                    oldUsuarioidUsuarioOfProyectoListProyecto.getProyectoList().remove(proyectoListProyecto);
                    oldUsuarioidUsuarioOfProyectoListProyecto = em.merge(oldUsuarioidUsuarioOfProyectoListProyecto);
                }
            }
            for (Requisitosdeproyecto requisitosdeproyectoListRequisitosdeproyecto : usuario.getRequisitosdeproyectoList()) {
                Usuario oldUsuarioOfRequisitosdeproyectoListRequisitosdeproyecto = requisitosdeproyectoListRequisitosdeproyecto.getUsuario();
                requisitosdeproyectoListRequisitosdeproyecto.setUsuario(usuario);
                requisitosdeproyectoListRequisitosdeproyecto = em.merge(requisitosdeproyectoListRequisitosdeproyecto);
                if (oldUsuarioOfRequisitosdeproyectoListRequisitosdeproyecto != null) {
                    oldUsuarioOfRequisitosdeproyectoListRequisitosdeproyecto.getRequisitosdeproyectoList().remove(requisitosdeproyectoListRequisitosdeproyecto);
                    oldUsuarioOfRequisitosdeproyectoListRequisitosdeproyecto = em.merge(oldUsuarioOfRequisitosdeproyectoListRequisitosdeproyecto);
                }
            }
            for (Impactocambio impactocambioListImpactocambio : usuario.getImpactocambioList()) {
                Usuario oldIdUsuarioaltaOfImpactocambioListImpactocambio = impactocambioListImpactocambio.getIdUsuarioalta();
                impactocambioListImpactocambio.setIdUsuarioalta(usuario);
                impactocambioListImpactocambio = em.merge(impactocambioListImpactocambio);
                if (oldIdUsuarioaltaOfImpactocambioListImpactocambio != null) {
                    oldIdUsuarioaltaOfImpactocambioListImpactocambio.getImpactocambioList().remove(impactocambioListImpactocambio);
                    oldIdUsuarioaltaOfImpactocambioListImpactocambio = em.merge(oldIdUsuarioaltaOfImpactocambioListImpactocambio);
                }
            }
            for (Recursosderequisito recursosderequisitoListRecursosderequisito : usuario.getRecursosderequisitoList()) {
                Usuario oldUsuarioaltaOfRecursosderequisitoListRecursosderequisito = recursosderequisitoListRecursosderequisito.getUsuarioalta();
                recursosderequisitoListRecursosderequisito.setUsuarioalta(usuario);
                recursosderequisitoListRecursosderequisito = em.merge(recursosderequisitoListRecursosderequisito);
                if (oldUsuarioaltaOfRecursosderequisitoListRecursosderequisito != null) {
                    oldUsuarioaltaOfRecursosderequisitoListRecursosderequisito.getRecursosderequisitoList().remove(recursosderequisitoListRecursosderequisito);
                    oldUsuarioaltaOfRecursosderequisitoListRecursosderequisito = em.merge(oldUsuarioaltaOfRecursosderequisitoListRecursosderequisito);
                }
            }
            for (Asignacionesproyecto asignacionesproyectoListAsignacionesproyecto : usuario.getAsignacionesproyectoList()) {
                Usuario oldUsuarioOfAsignacionesproyectoListAsignacionesproyecto = asignacionesproyectoListAsignacionesproyecto.getUsuario();
                asignacionesproyectoListAsignacionesproyecto.setUsuario(usuario);
                asignacionesproyectoListAsignacionesproyecto = em.merge(asignacionesproyectoListAsignacionesproyecto);
                if (oldUsuarioOfAsignacionesproyectoListAsignacionesproyecto != null) {
                    oldUsuarioOfAsignacionesproyectoListAsignacionesproyecto.getAsignacionesproyectoList().remove(asignacionesproyectoListAsignacionesproyecto);
                    oldUsuarioOfAsignacionesproyectoListAsignacionesproyecto = em.merge(oldUsuarioOfAsignacionesproyectoListAsignacionesproyecto);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#edit(org.osiris.persistence.Usuario)
	 */
    public void edit(Usuario usuario) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Usuario persistentUsuario = em.find(Usuario.class, usuario.getIdUsuario());
            List<Requisito> requisitoListOld = persistentUsuario.getRequisitoList();
            List<Requisito> requisitoListNew = usuario.getRequisitoList();
            List<Requisito> requisitoCollection1Old = persistentUsuario.getRequisitoCollection1();
            List<Requisito> requisitoCollection1New = usuario.getRequisitoCollection1();
            List<Detallerequisito> detallerequisitoListOld = persistentUsuario.getDetallerequisitoList();
            List<Detallerequisito> detallerequisitoListNew = usuario.getDetallerequisitoList();
            List<Proyecto> proyectoListOld = persistentUsuario.getProyectoList();
            List<Proyecto> proyectoListNew = usuario.getProyectoList();
            List<Requisitosdeproyecto> requisitosdeproyectoListOld = persistentUsuario.getRequisitosdeproyectoList();
            List<Requisitosdeproyecto> requisitosdeproyectoListNew = usuario.getRequisitosdeproyectoList();
            List<Impactocambio> impactocambioListOld = persistentUsuario.getImpactocambioList();
            List<Impactocambio> impactocambioListNew = usuario.getImpactocambioList();
            List<Recursosderequisito> recursosderequisitoListOld = persistentUsuario.getRecursosderequisitoList();
            List<Recursosderequisito> recursosderequisitoListNew = usuario.getRecursosderequisitoList();
            List<Asignacionesproyecto> asignacionesproyectoListOld = persistentUsuario.getAsignacionesproyectoList();
            List<Asignacionesproyecto> asignacionesproyectoListNew = usuario.getAsignacionesproyectoList();
            List<String> illegalOrphanMessages = null;
            for (Requisito requisitoListOldRequisito : requisitoListOld) {
                if (!requisitoListNew.contains(requisitoListOldRequisito)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Requisito " + requisitoListOldRequisito + " since its responsable field is not nullable.");
                }
            }
            for (Requisito requisitoCollection1OldRequisito : requisitoCollection1Old) {
                if (!requisitoCollection1New.contains(requisitoCollection1OldRequisito)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Requisito " + requisitoCollection1OldRequisito + " since its autor field is not nullable.");
                }
            }
            for (Detallerequisito detallerequisitoListOldDetallerequisito : detallerequisitoListOld) {
                if (!detallerequisitoListNew.contains(detallerequisitoListOldDetallerequisito)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Detallerequisito " + detallerequisitoListOldDetallerequisito + " since its usuarioalta field is not nullable.");
                }
            }
            for (Proyecto proyectoListOldProyecto : proyectoListOld) {
                if (!proyectoListNew.contains(proyectoListOldProyecto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Proyecto " + proyectoListOldProyecto + " since its usuarioidUsuario field is not nullable.");
                }
            }
            for (Requisitosdeproyecto requisitosdeproyectoListOldRequisitosdeproyecto : requisitosdeproyectoListOld) {
                if (!requisitosdeproyectoListNew.contains(requisitosdeproyectoListOldRequisitosdeproyecto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Requisitosdeproyecto " + requisitosdeproyectoListOldRequisitosdeproyecto + " since its usuario field is not nullable.");
                }
            }
            for (Impactocambio impactocambioListOldImpactocambio : impactocambioListOld) {
                if (!impactocambioListNew.contains(impactocambioListOldImpactocambio)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Impactocambio " + impactocambioListOldImpactocambio + " since its idUsuarioalta field is not nullable.");
                }
            }
            for (Recursosderequisito recursosderequisitoListOldRecursosderequisito : recursosderequisitoListOld) {
                if (!recursosderequisitoListNew.contains(recursosderequisitoListOldRecursosderequisito)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Recursosderequisito " + recursosderequisitoListOldRecursosderequisito + " since its usuarioalta field is not nullable.");
                }
            }
            for (Asignacionesproyecto asignacionesproyectoListOldAsignacionesproyecto : asignacionesproyectoListOld) {
                if (!asignacionesproyectoListNew.contains(asignacionesproyectoListOldAsignacionesproyecto)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Asignacionesproyecto " + asignacionesproyectoListOldAsignacionesproyecto + " since its usuario field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Requisito> attachedRequisitoListNew = new ArrayList<Requisito>();
            for (Requisito requisitoListNewRequisitoToAttach : requisitoListNew) {
                requisitoListNewRequisitoToAttach = em.getReference(requisitoListNewRequisitoToAttach.getClass(), requisitoListNewRequisitoToAttach.getIdRequisito());
                attachedRequisitoListNew.add(requisitoListNewRequisitoToAttach);
            }
            requisitoListNew = attachedRequisitoListNew;
            usuario.setRequisitoList(requisitoListNew);
            List<Requisito> attachedRequisitoCollection1New = new ArrayList<Requisito>();
            for (Requisito requisitoCollection1NewRequisitoToAttach : requisitoCollection1New) {
                requisitoCollection1NewRequisitoToAttach = em.getReference(requisitoCollection1NewRequisitoToAttach.getClass(), requisitoCollection1NewRequisitoToAttach.getIdRequisito());
                attachedRequisitoCollection1New.add(requisitoCollection1NewRequisitoToAttach);
            }
            requisitoCollection1New = attachedRequisitoCollection1New;
            usuario.setRequisitoCollection1(requisitoCollection1New);
            List<Detallerequisito> attachedDetallerequisitoListNew = new ArrayList<Detallerequisito>();
            for (Detallerequisito detallerequisitoListNewDetallerequisitoToAttach : detallerequisitoListNew) {
                detallerequisitoListNewDetallerequisitoToAttach = em.getReference(detallerequisitoListNewDetallerequisitoToAttach.getClass(), detallerequisitoListNewDetallerequisitoToAttach.getIdRequisito());
                attachedDetallerequisitoListNew.add(detallerequisitoListNewDetallerequisitoToAttach);
            }
            detallerequisitoListNew = attachedDetallerequisitoListNew;
            usuario.setDetallerequisitoList(detallerequisitoListNew);
            List<Proyecto> attachedProyectoListNew = new ArrayList<Proyecto>();
            for (Proyecto proyectoListNewProyectoToAttach : proyectoListNew) {
                proyectoListNewProyectoToAttach = em.getReference(proyectoListNewProyectoToAttach.getClass(), proyectoListNewProyectoToAttach.getIdProyecto());
                attachedProyectoListNew.add(proyectoListNewProyectoToAttach);
            }
            proyectoListNew = attachedProyectoListNew;
            usuario.setProyectoList(proyectoListNew);
            List<Requisitosdeproyecto> attachedRequisitosdeproyectoListNew = new ArrayList<Requisitosdeproyecto>();
            for (Requisitosdeproyecto requisitosdeproyectoListNewRequisitosdeproyectoToAttach : requisitosdeproyectoListNew) {
                requisitosdeproyectoListNewRequisitosdeproyectoToAttach = em.getReference(requisitosdeproyectoListNewRequisitosdeproyectoToAttach.getClass(), requisitosdeproyectoListNewRequisitosdeproyectoToAttach.getRequisitosdeproyectoPK());
                attachedRequisitosdeproyectoListNew.add(requisitosdeproyectoListNewRequisitosdeproyectoToAttach);
            }
            requisitosdeproyectoListNew = attachedRequisitosdeproyectoListNew;
            usuario.setRequisitosdeproyectoList(requisitosdeproyectoListNew);
            List<Impactocambio> attachedImpactocambioListNew = new ArrayList<Impactocambio>();
            for (Impactocambio impactocambioListNewImpactocambioToAttach : impactocambioListNew) {
                impactocambioListNewImpactocambioToAttach = em.getReference(impactocambioListNewImpactocambioToAttach.getClass(), impactocambioListNewImpactocambioToAttach.getIdPeticion());
                attachedImpactocambioListNew.add(impactocambioListNewImpactocambioToAttach);
            }
            impactocambioListNew = attachedImpactocambioListNew;
            usuario.setImpactocambioList(impactocambioListNew);
            List<Recursosderequisito> attachedRecursosderequisitoListNew = new ArrayList<Recursosderequisito>();
            for (Recursosderequisito recursosderequisitoListNewRecursosderequisitoToAttach : recursosderequisitoListNew) {
                recursosderequisitoListNewRecursosderequisitoToAttach = em.getReference(recursosderequisitoListNewRecursosderequisitoToAttach.getClass(), recursosderequisitoListNewRecursosderequisitoToAttach.getRecursosderequisitoPK());
                attachedRecursosderequisitoListNew.add(recursosderequisitoListNewRecursosderequisitoToAttach);
            }
            recursosderequisitoListNew = attachedRecursosderequisitoListNew;
            usuario.setRecursosderequisitoList(recursosderequisitoListNew);
            List<Asignacionesproyecto> attachedAsignacionesproyectoListNew = new ArrayList<Asignacionesproyecto>();
            for (Asignacionesproyecto asignacionesproyectoListNewAsignacionesproyectoToAttach : asignacionesproyectoListNew) {
                asignacionesproyectoListNewAsignacionesproyectoToAttach = em.getReference(asignacionesproyectoListNewAsignacionesproyectoToAttach.getClass(), asignacionesproyectoListNewAsignacionesproyectoToAttach.getAsignacionesproyectoPK());
                attachedAsignacionesproyectoListNew.add(asignacionesproyectoListNewAsignacionesproyectoToAttach);
            }
            asignacionesproyectoListNew = attachedAsignacionesproyectoListNew;
            usuario.setAsignacionesproyectoList(asignacionesproyectoListNew);
            usuario = em.merge(usuario);
            for (Requisito requisitoListNewRequisito : requisitoListNew) {
                if (!requisitoListOld.contains(requisitoListNewRequisito)) {
                    Usuario oldResponsableOfRequisitoListNewRequisito = requisitoListNewRequisito.getResponsable();
                    requisitoListNewRequisito.setResponsable(usuario);
                    requisitoListNewRequisito = em.merge(requisitoListNewRequisito);
                    if (oldResponsableOfRequisitoListNewRequisito != null && !oldResponsableOfRequisitoListNewRequisito.equals(usuario)) {
                        oldResponsableOfRequisitoListNewRequisito.getRequisitoList().remove(requisitoListNewRequisito);
                        oldResponsableOfRequisitoListNewRequisito = em.merge(oldResponsableOfRequisitoListNewRequisito);
                    }
                }
            }
            for (Requisito requisitoCollection1NewRequisito : requisitoCollection1New) {
                if (!requisitoCollection1Old.contains(requisitoCollection1NewRequisito)) {
                    Usuario oldAutorOfRequisitoCollection1NewRequisito = requisitoCollection1NewRequisito.getAutor();
                    requisitoCollection1NewRequisito.setAutor(usuario);
                    requisitoCollection1NewRequisito = em.merge(requisitoCollection1NewRequisito);
                    if (oldAutorOfRequisitoCollection1NewRequisito != null && !oldAutorOfRequisitoCollection1NewRequisito.equals(usuario)) {
                        oldAutorOfRequisitoCollection1NewRequisito.getRequisitoCollection1().remove(requisitoCollection1NewRequisito);
                        oldAutorOfRequisitoCollection1NewRequisito = em.merge(oldAutorOfRequisitoCollection1NewRequisito);
                    }
                }
            }
            for (Detallerequisito detallerequisitoListNewDetallerequisito : detallerequisitoListNew) {
                if (!detallerequisitoListOld.contains(detallerequisitoListNewDetallerequisito)) {
                    Usuario oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito = detallerequisitoListNewDetallerequisito.getUsuarioalta();
                    detallerequisitoListNewDetallerequisito.setUsuarioalta(usuario);
                    detallerequisitoListNewDetallerequisito = em.merge(detallerequisitoListNewDetallerequisito);
                    if (oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito != null && !oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito.equals(usuario)) {
                        oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito.getDetallerequisitoList().remove(detallerequisitoListNewDetallerequisito);
                        oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito = em.merge(oldUsuarioaltaOfDetallerequisitoListNewDetallerequisito);
                    }
                }
            }
            for (Proyecto proyectoListNewProyecto : proyectoListNew) {
                if (!proyectoListOld.contains(proyectoListNewProyecto)) {
                    Usuario oldUsuarioidUsuarioOfProyectoListNewProyecto = proyectoListNewProyecto.getUsuarioidUsuario();
                    proyectoListNewProyecto.setUsuarioidUsuario(usuario);
                    proyectoListNewProyecto = em.merge(proyectoListNewProyecto);
                    if (oldUsuarioidUsuarioOfProyectoListNewProyecto != null && !oldUsuarioidUsuarioOfProyectoListNewProyecto.equals(usuario)) {
                        oldUsuarioidUsuarioOfProyectoListNewProyecto.getProyectoList().remove(proyectoListNewProyecto);
                        oldUsuarioidUsuarioOfProyectoListNewProyecto = em.merge(oldUsuarioidUsuarioOfProyectoListNewProyecto);
                    }
                }
            }
            for (Requisitosdeproyecto requisitosdeproyectoListNewRequisitosdeproyecto : requisitosdeproyectoListNew) {
                if (!requisitosdeproyectoListOld.contains(requisitosdeproyectoListNewRequisitosdeproyecto)) {
                    Usuario oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto = requisitosdeproyectoListNewRequisitosdeproyecto.getUsuario();
                    requisitosdeproyectoListNewRequisitosdeproyecto.setUsuario(usuario);
                    requisitosdeproyectoListNewRequisitosdeproyecto = em.merge(requisitosdeproyectoListNewRequisitosdeproyecto);
                    if (oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto != null && !oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto.equals(usuario)) {
                        oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto.getRequisitosdeproyectoList().remove(requisitosdeproyectoListNewRequisitosdeproyecto);
                        oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto = em.merge(oldUsuarioOfRequisitosdeproyectoListNewRequisitosdeproyecto);
                    }
                }
            }
            for (Impactocambio impactocambioListNewImpactocambio : impactocambioListNew) {
                if (!impactocambioListOld.contains(impactocambioListNewImpactocambio)) {
                    Usuario oldIdUsuarioaltaOfImpactocambioListNewImpactocambio = impactocambioListNewImpactocambio.getIdUsuarioalta();
                    impactocambioListNewImpactocambio.setIdUsuarioalta(usuario);
                    impactocambioListNewImpactocambio = em.merge(impactocambioListNewImpactocambio);
                    if (oldIdUsuarioaltaOfImpactocambioListNewImpactocambio != null && !oldIdUsuarioaltaOfImpactocambioListNewImpactocambio.equals(usuario)) {
                        oldIdUsuarioaltaOfImpactocambioListNewImpactocambio.getImpactocambioList().remove(impactocambioListNewImpactocambio);
                        oldIdUsuarioaltaOfImpactocambioListNewImpactocambio = em.merge(oldIdUsuarioaltaOfImpactocambioListNewImpactocambio);
                    }
                }
            }
            for (Recursosderequisito recursosderequisitoListNewRecursosderequisito : recursosderequisitoListNew) {
                if (!recursosderequisitoListOld.contains(recursosderequisitoListNewRecursosderequisito)) {
                    Usuario oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito = recursosderequisitoListNewRecursosderequisito.getUsuarioalta();
                    recursosderequisitoListNewRecursosderequisito.setUsuarioalta(usuario);
                    recursosderequisitoListNewRecursosderequisito = em.merge(recursosderequisitoListNewRecursosderequisito);
                    if (oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito != null && !oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito.equals(usuario)) {
                        oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito.getRecursosderequisitoList().remove(recursosderequisitoListNewRecursosderequisito);
                        oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito = em.merge(oldUsuarioaltaOfRecursosderequisitoListNewRecursosderequisito);
                    }
                }
            }
            for (Asignacionesproyecto asignacionesproyectoListNewAsignacionesproyecto : asignacionesproyectoListNew) {
                if (!asignacionesproyectoListOld.contains(asignacionesproyectoListNewAsignacionesproyecto)) {
                    Usuario oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto = asignacionesproyectoListNewAsignacionesproyecto.getUsuario();
                    asignacionesproyectoListNewAsignacionesproyecto.setUsuario(usuario);
                    asignacionesproyectoListNewAsignacionesproyecto = em.merge(asignacionesproyectoListNewAsignacionesproyecto);
                    if (oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto != null && !oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto.equals(usuario)) {
                        oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto.getAsignacionesproyectoList().remove(asignacionesproyectoListNewAsignacionesproyecto);
                        oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto = em.merge(oldUsuarioOfAsignacionesproyectoListNewAsignacionesproyecto);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = usuario.getIdUsuario();
                if (findUsuario(id) == null) {
                    throw new NonexistentEntityException("The usuario with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#destroy(java.lang.Long)
	 */
    public void destroy(Long id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Usuario usuario;
            try {
                usuario = em.getReference(Usuario.class, id);
                usuario.getIdUsuario();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The usuario with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Requisito> requisitoListOrphanCheck = usuario.getRequisitoList();
            for (Requisito requisitoListOrphanCheckRequisito : requisitoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Requisito " + requisitoListOrphanCheckRequisito + " in its requisitoList field has a non-nullable responsable field.");
            }
            List<Requisito> requisitoCollection1OrphanCheck = usuario.getRequisitoCollection1();
            for (Requisito requisitoCollection1OrphanCheckRequisito : requisitoCollection1OrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Requisito " + requisitoCollection1OrphanCheckRequisito + " in its requisitoCollection1 field has a non-nullable autor field.");
            }
            List<Detallerequisito> detallerequisitoListOrphanCheck = usuario.getDetallerequisitoList();
            for (Detallerequisito detallerequisitoListOrphanCheckDetallerequisito : detallerequisitoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Detallerequisito " + detallerequisitoListOrphanCheckDetallerequisito + " in its detallerequisitoList field has a non-nullable usuarioalta field.");
            }
            List<Proyecto> proyectoListOrphanCheck = usuario.getProyectoList();
            for (Proyecto proyectoListOrphanCheckProyecto : proyectoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Proyecto " + proyectoListOrphanCheckProyecto + " in its proyectoList field has a non-nullable usuarioidUsuario field.");
            }
            List<Requisitosdeproyecto> requisitosdeproyectoListOrphanCheck = usuario.getRequisitosdeproyectoList();
            for (Requisitosdeproyecto requisitosdeproyectoListOrphanCheckRequisitosdeproyecto : requisitosdeproyectoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Requisitosdeproyecto " + requisitosdeproyectoListOrphanCheckRequisitosdeproyecto + " in its requisitosdeproyectoList field has a non-nullable usuario field.");
            }
            List<Impactocambio> impactocambioListOrphanCheck = usuario.getImpactocambioList();
            for (Impactocambio impactocambioListOrphanCheckImpactocambio : impactocambioListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Impactocambio " + impactocambioListOrphanCheckImpactocambio + " in its impactocambioList field has a non-nullable idUsuarioalta field.");
            }
            List<Recursosderequisito> recursosderequisitoListOrphanCheck = usuario.getRecursosderequisitoList();
            for (Recursosderequisito recursosderequisitoListOrphanCheckRecursosderequisito : recursosderequisitoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Recursosderequisito " + recursosderequisitoListOrphanCheckRecursosderequisito + " in its recursosderequisitoList field has a non-nullable usuarioalta field.");
            }
            List<Asignacionesproyecto> asignacionesproyectoListOrphanCheck = usuario.getAsignacionesproyectoList();
            for (Asignacionesproyecto asignacionesproyectoListOrphanCheckAsignacionesproyecto : asignacionesproyectoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Usuario (" + usuario + ") cannot be destroyed since the Asignacionesproyecto " + asignacionesproyectoListOrphanCheckAsignacionesproyecto + " in its asignacionesproyectoList field has a non-nullable usuario field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(usuario);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#findUsuarioEntities()
	 */
    public List<Usuario> findUsuarioEntities() {
        return findUsuarioEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#findUsuarioEntities(int, int)
	 */
    public List<Usuario> findUsuarioEntities(int maxResults, int firstResult) {
        return findUsuarioEntities(false, maxResults, firstResult);
    }

    private List<Usuario> findUsuarioEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Usuario as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#findUsuario(java.lang.Long)
	 */
    public Usuario findUsuario(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Usuario.class, id);
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.UsuarioInterface#getUsuarioCount()
	 */
    public int getUsuarioCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Usuario as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
